#!/usr/bin/env python
# -*- coding:utf-8 -*-

# file:TCP-serv.py
# author: 马国鑫
# datetime:2022/4/17 10:19
# software: PyCharm

"""
this is function  description 
"""

import socket


def handler_client_request(tcp_client_socket):
    """处理客户端请求的函数"""
    # 可以循环和客户聊天
    while True:
        # 5接收数据
        client_data = tcp_client_socket.recv(1024)
        if len(client_data) == 0:
            print("客户端关闭了！！！")
            break
        # 对二进制数据解码
        client_data = client_data.decode('gbk')
        print(client_data)
        # 6发送数据
        tcp_client_socket.send("123".encode())
    tcp_client_socket.close()


def main():
    # 1创建服务端端套接字对象
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 端口复用设置，让程序退出端口号立即释放
    # 参数1 socket选项列表
    # 参数2 地址复用
    # 参数3 设置成True就是开启，默认不开启
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

    # 2绑定端口号
    # 我的ip地址可以不写(服务器的ip地址)默认是本机
    tcp_server_socket.bind(("192.168.176.1", 8080))
    # 3设置监听
    # 设置最大监听数
    # tcp_server_socket从主动套接字变成了被动套接字
    # 此时只能接受数据，不能发送数据
    # 作用是为了接受链接请求
    tcp_server_socket.listen(128)

    # 让服务器能够一直保持接受客户端请求
    while True:
        # 4等待接受客户端的连接请求
        # 返回值是一个元组，元素1 和客户端通讯的socket 元素2 客户端的地址信息(ip,port)
        #  我们需要的是第一个socket对象
        # client_socket负责处理客户端请求的
        tcp_client_socket, client_addr = tcp_server_socket.accept()
        # 处理客户端请求
        handler_client_request(tcp_client_socket)
    # 7关闭套接字
    tcp_client_socket.close()
    tcp_server_socket.close()


if __name__ == '__main__':
    main()
